package main

import (
	"demo/15/model"
	"errors"
	"fmt"
	"net"
	"net/http"
	"net/rpc"
)

// 自定义结构体，用于绑定用户处理方法
type UserHandler struct {
}

// 获得用户信息的方法，绑定到结构体UserHandler的指针类型上
func (handler *UserHandler) GetUserInfo(name string, reply *model.UserDetail) (err error) {

	// 打印一行注释信息，一般程序入口都会如此处理，方便出现错误时，检查执行进度
	fmt.Printf("try to get user info by %s", name)

	// 校验入参的合法性，对于空参数，直接返回错误
	if len(name) == 0 {
		return errors.New("the query name cannot be empty")
	}

	// 通常逻辑是从数据库或者缓存中查询， 在此处直接赋值。RPC响应是通过reply来传递到客户端的
	reply.Id = 123
	reply.Username = name
	reply.Nickname = "尊敬的" + name

	// 函数声明中，返回值是错误对象。当一切正常时，错误为空。
	return nil
}

func main1() {
	// 将UserHandler的一个实例对象，注册为RPC服务
	rpc.Register(new(UserHandler))

	// RPC通信，使用HTTP协议进行处理
	rpc.HandleHTTP()

	// 监听8090端口，并获得监听器对象
	listener, err := net.Listen("tcp", "127.0.0.1:8090")

	// 如果发生错误，则打印错误信息，并直接退出程序
	if err != nil {
		fmt.Println("监听TCP端口出错")
		return
	}

	// 启动监听服务，准备接收来自于客户端的RPC请求
	err = http.Serve(listener, nil)
	if err != nil {
		fmt.Println("获取HTTP连接出错")
	}
}
